#include "equipo.h"

#include <stdlib.h>
#include <string.h>

#include "abb.h"

#define MAXJUG 23

struct equipo {
		char *nombre; 
		char **plantilla; //lista de jugadores ordeneada por dorsal.
		abb_t *plantilla_ordenada;//arbol de jugadores ordenadas por nombre.
		size_t cantidad_jugadores;
		};

equipo_t *equipo_crear(const char *nombre)
{
	equipo_t *equipo = malloc(sizeof(equipo_t));
	
	if (!equipo)
		return NULL;
	
	equipo->nombre = malloc(sizeof(char)*(strlen(nombre)+1));
	if (!(equipo->nombre))
		{
			free(equipo);
			return NULL;
		}

	equipo->plantilla = malloc (sizeof (char*) * MAXJUG);
	if (!equipo->plantilla)
		{
			free(equipo->nombre);
			free(equipo);
			return NULL;
		}

	equipo->plantilla_ordenada = abb_crear(strcmp, free);
	if (!equipo->plantilla_ordenada)
		{
			free(equipo->plantilla);
			free(equipo->nombre);
			free(equipo);
			return NULL;
		}

	strcpy(equipo->nombre,nombre);

	equipo->cantidad_jugadores = 0;

	return equipo;
}


void equipo_destruir(void* dato_equipo)
{
	if (!dato_equipo)
		return;

	equipo_t* equipo = dato_equipo;
	abb_destruir(equipo->plantilla_ordenada);
	free(equipo->plantilla);
	free(equipo->nombre);
	free(equipo);
}

size_t equipo_agregar_jugador(equipo_t *equipo, const char *jugador)
{
	if (!equipo || !jugador)
		return 0;

	if (equipo->cantidad_jugadores >= MAXJUG)
		return 0;

	char *nombre = malloc(sizeof(char)*(strlen(jugador)+1));
	if (!nombre)
		return 0;

	strcpy(nombre,jugador);

	equipo->plantilla[equipo->cantidad_jugadores] = nombre;
	equipo->cantidad_jugadores++;
	if (!abb_guardar(equipo->plantilla_ordenada,nombre, nombre))
		{
			free(equipo->plantilla[equipo->cantidad_jugadores--]);
			return 0;
		}

	return equipo->cantidad_jugadores;
}

bool equipo_quitar_ultimo_jugador(equipo_t *equipo)
{
	if (!equipo)
		return false;
	
	if (equipo->cantidad_jugadores)
		free(equipo->plantilla[--equipo->cantidad_jugadores]);
	return true;
}

const char *equipo_obtener_jugador(equipo_t *equipo, size_t dorsal)
{
	if (!equipo || !dorsal)
		return NULL;

	if (dorsal > equipo->cantidad_jugadores)
		return NULL;

	return equipo->plantilla[dorsal - 1];
}

void equipo_iterar_plantel(const equipo_t *equipo, visitar_t visitar, void *extra)
{
  if (!equipo)
    return;

  abb_in_order(equipo->plantilla_ordenada,visitar,extra);
}

void equipo_listar_plantel(const equipo_t *equipo, visitar_t visitar, void *extra)
{
	if(!equipo)
		return;

	for (int i = 0; i < MAXJUG; ++i)
		visitar (NULL, equipo->plantilla[i], extra);
}

